// 主要思路就是先遍历T，再将T转为必需得到新的类型，判断是否属性新的类型
type GetRequired<T> = {
  [P in keyof T as T[P] extends Required<T>[P] ? P : never]: T[P];
};
type I = GetRequired<{ foo: number; bar?: string }>; // expected to be { foo: number }
